use log::info;

trait Animal {
    fn speak(&self);
}

trait Pet: Animal {
    fn speak(&self); // 与 Animal 中的方法同名
}

struct Dog;

impl Animal for Dog {
    fn speak(&self) {
        info!("Animal: Woof!");
    }
}

impl Pet for Dog {
    fn speak(&self) {
        info!("Pet: Woof woof!");
    }
}

impl Dog {
    fn speak(&self) {
        info!("Dog: Woof!");
    }
}

#[test]
fn main_test() {
    let dog = Dog;

    // 调用不同的 speak 方法
    dog.speak();                    // 调用 Dog 的固有方法
    Animal::speak(&dog);           // 调用 Animal 的 speak
    Pet::speak(&dog);              // 调用 Pet 的 speak
    <Dog as Animal>::speak(&dog);  // 完全限定语法
    <Dog as Pet>::speak(&dog);     // 完全限定语法
}